package cn.skylark.wcm.controller;

import cn.skylark.wcm.common.util.ReturnMap;
import cn.skylark.wcm.entity.Resources;
import cn.skylark.wcm.entity.Role;
import cn.skylark.wcm.service.RoleResourcesService;
import cn.skylark.wcm.service.RoleService;
import com.github.pagehelper.PageInfo;
import net.sf.json.JSONArray;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.http.HttpServletRequest;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 角色页面控制器
 *
 * @author chuhl
 * @since 2017年12月4日14:14:18
 */
@RestController
@RequestMapping("/roles")
public class RoleController {
    private Logger logger = LoggerFactory.getLogger(RoleController.class);
    @Autowired
    RoleService roleService;
    @Autowired
    RoleResourcesService roleResourcesService;

    /**
     * 取得所有角色
     * 业务：通过前台传回来的参数，在角色表里面查询所有的角色，包括不同
     * 公司的角色列表，然后返回总条数和角色列表的list集合
     *
     * @param role   Role  角色实体类
     * @param draw   String
     * @param start  int  起始
     * @param length int  每页显示条数
     * @return Map<String ,Object>
     */
    @RequestMapping
    public Map<String, Object> getAll( Role role, String draw,
                                       @RequestParam(required = false, defaultValue = "1") int start,
                                       @RequestParam(required = false, defaultValue = "10") int length ) {

        Map<String, Object> map = new HashMap<>();
        PageInfo<Role> pageInfo = roleService.selectByPage(role, start, length);
        map.put("draw", draw);
        map.put("recordsTotal", pageInfo.getTotal());
        map.put("recordsFiltered", pageInfo.getTotal());
        map.put("data", pageInfo.getList());
        return map;
    }

    /**
     * 取得指定角色列表
     * 业务：通过用户id获取指定的角色列表
     *
     * @param uid Integer 角色 id
     * @return List<Role>  角色列表
     */
    @RequestMapping("/rolesWithSelected")
    public List<Role> rolesWithSelected( Integer uid ) {
        return roleService.queryRoleListWithSelected(uid);
    }

    /**
     * 分配权限
     * 业务：当点击分配角色时，查询该角色是否存在，如果存在返回相应的提示。
     * 不存在的话，进行插入操作。
     *
     * @param roldid   角色id
     * @param resourcresid 权限id
     * @return String
     */
    @RequestMapping("/saveRoleResources")
    public String saveRoleResources( Integer roldid,String[] resourcresid) {
        ReturnMap returnMap = new ReturnMap();
        if (StringUtils.isEmpty(roldid)) {
            returnMap.setFlg(1);
            returnMap.setMessage("该角色不存在");
            return returnMap.ReturnMap();
        }
        try {
            roleResourcesService.addRoleResources(roldid,resourcresid);
            returnMap.setFlg(0);
            returnMap.setMessage("分配权限成功");
        } catch (Exception e) {
            logger.info("异常信息是" + e);
            e.printStackTrace();
            returnMap.setFlg(2);
            returnMap.setMessage("分配权限失败");
        }
        return returnMap.ReturnMap();
    }

    /**
     * 追加角色
     * 业务：获取前台填入的信息，在点击添加的时候通过租户id和角色名称判断该角色是否存在，
     * 如果存在就返回flag=1和提示信息。如果该角色不存在，然后执行添加的操作，
     * 添加成功返回flg=0和提示信息;如果异常就会返回flg=2和提示信息。
     *
     * @param role Role 角色的实体类
     * @return String
     */
    @RequestMapping(value = "/add")
    public String add( Role role ) {
        ReturnMap returnMap = new ReturnMap();
        //通过角色名字和公司id查询是否该角色已经存在
        Role r = roleService.selectByParameter(role);
        //如果存在的话返回信息
        if (r != null) {
            returnMap.setFlg(1);
            returnMap.setMessage("该角色已存在！");
            return returnMap.ReturnMap();
        }
        try {
            // 如果该公司下不存在该角色，则保存前端传来的角色信息
            roleService.save(role);
            returnMap.setFlg(0);
            returnMap.setMessage("添加角色成功");
        } catch (Exception e) {
            e.printStackTrace();
            returnMap.setFlg(2);
            returnMap.setMessage("添加角色失败");
        }
        return returnMap.ReturnMap();
    }


    /**
     * 伦理删除
     * 业务：接收前台传来的角色id，然后进行伦理删除角色表和角色用户关联表的信息。
     * 通过角色id修改角色表中delflg的状态为1，然后通过角色id修改角色用户关联表的
     * delflg为1
     *
     * @param id Integer  角色id
     * @return
     */
    @RequestMapping(value = "/logicDelete")
    public String logicDelete( Integer id ) {
        ReturnMap returnMap = new ReturnMap();
        try {
            //根据角色的id逻辑删除
            roleService.deleteRoleById(id);
            returnMap.setFlg(0);
            returnMap.setMessage("删除成功");
        } catch (Exception e) {
            e.printStackTrace();
            returnMap.setFlg(2);
            returnMap.setMessage("删除失败");
        }
        return returnMap.ReturnMap();
    }

    /**
     * 通过条件获取角色列表
     * 业务：通过前台获取到查询条件，租户id ,start,length的变量值
     * 然后执行按条件分页查询的方法，返回一个pageinfo的集合，
     * 把返回的总条数和角色的list列表给前台
     *
     * @param role   角色实体类
     * @param start  开始是第几条
     * @param length 每页多少条
     * @return
     */
    @RequestMapping(value = "/getRolesByTenanId")
    public Map<String, Object> getRolesByTenanId(Role role, String draw, HttpServletRequest request,
                                                 @RequestParam(required = false, defaultValue = "1") int start,
                                                 @RequestParam(required = false, defaultValue = "10") int length) {
        Map<String, Object> map = new HashMap<>();
        try {
            String searchValue = request.getParameter("search[value]");
            logger.info("search:" + searchValue);
            String flag = request.getParameter("flag");

            //通过条件进行查询角色列表放到PageInfo中
            PageInfo<Role> pageInfo = roleService.selectByPara(role, flag, searchValue, start, length);
            //返回map集合，角色列表集合与数据总数
            map.put("recordsTotal", pageInfo.getTotal());
            map.put("recordsFiltered", pageInfo.getTotal());
            map.put("data", pageInfo.getList());
            map.put("draw", draw);
            map.put("code", 0);
            map.put("message", "角色对象获取成功");
            return map;
        } catch (Exception e) {
            e.printStackTrace();
            map.put("code", 2);
            map.put("message", "角色对象获取失败");
            return map;
        }

    }
    /**
     * 根据租户ID获取该租户所有权限
     * 业务：当点击分配权限的时候，通过前台传回来的租户id，通过连接查询，
     * 查询到该租户下的所有权限列表，然后返回一个json的数组格式，如果获取权限成功
     * 返回flg=1和权限的所有信息的json数组列表。
     *
     * @param tenanid 租户id
     * @param roleid  角色id
     * @return
     */
    @RequestMapping(value = "/getAllResourceWithTenanId")
    public String getAllResourceWithTenanId( Integer tenanid, Integer roleid ) {
        logger.info("传入参数" + "tenanid:" + tenanid + "userid:" + roleid);
        List<Map<String, Object>> mapList = new ArrayList<>();
        ReturnMap returnMap = new ReturnMap();
        try {
            //通过租户id获取本租户下的所有的权限进行分配权限
            List<Resources> resources = roleService.queryAllResourceWithTenanId(tenanid);
            for (int i = 0; i < resources.size(); i++) {
                Map<String, Object> map = new HashMap<>();
                map.put("id", resources.get(i).getId());
                map.put("name", resources.get(i).getName());
                map.put("Pid", resources.get(i).getParentid());
                //根据resourceId判断在角色权限表里是否存在该关联，如果存在就标识。
                int count = roleResourcesService.selectRoleResource(resources.get(i).getId(), roleid);
                if (count != 0) {
                    map.put("flg", 1);
                } else {
                    map.put("flg", 0);
                }
                mapList.add(map);
            }
            returnMap.setFlg(0);
            returnMap.setMessage("获得权限成功");
            returnMap.setData(JSONArray.fromObject(mapList).toString());
        } catch (Exception e) {
            logger.info("异常类型为" + e);
            e.printStackTrace();
            returnMap.setFlg(2);
            returnMap.setMessage("获得权限失败");
        }
        return returnMap.ReturnMap();
    }


}
